package com.common.example.config.service;

import com.common.example.config.controller.vo.PageVo;
import tk.mybatis.mapper.entity.Example;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface IBaseCommonService<T> {

	/**
	 * 添加对象,必须指定ID
	 * 
	 * @param entity
	 *            要实例化的实体，不能为null
	 * @return 受影响的结果数
	 */
	T save(T entity);


	/**
	 * 添加对象,允许自行指定新增人和新增时间,必须指定ID
	 * 
	 * @param entity
	 *            要实例化的实体，不能为null
	 * @return 受影响的结果数
	 */
	T initSaveEntity(T entity);

	/**
	 * 批量插入，如果为空列表则直接返回
	 * 
	 * @param entityList
	 *            需要批量插入的实体对象列表
	 */
	void save(Collection<T> entityList);


	/**
	 * 更新对象 ,包括报表表单提交字段值为空的；
	 * 
	 * @param entity
	 * @return
	 */
	int updateIncludingNull(T entity);

	/**
	 * 批量更新，该方法根据实体ID更新已设置的字段，未设置的字段不更新
	 * 
	 * @param entityList
	 *            批量更新的实体对象列表
	 */
	int update(Collection<T> entityList);

	/**
	 * 更新对象,允许自行指定新增人和新增时间,对象必须设置ID
	 * 
	 * @param entity
	 *            实体的Id不能为null
	 * @return int 受影响结果数
	 */
	int update(T entity);

	public int updateByExample(T record, Example example);

	/**
	 * 根据Id删除对象
	 * 
	 * @param id
	 *            要删除的ID，不能为null
	 * @return int 受影响结果数
	 */
	int delete(Object id);



	/**
	 * 通过Id查询一个对象，如果id为null这会抛出IllegalArgumentException异常
	 * 
	 * @param id
	 *            主键，不能为null
	 * @return 结果对象，如果未找到返回null
	 */
	T findById(Serializable id);

	/**
	 * 查询一个对象，如果返回的结果多于一个对象将会抛出TooManyResultsException<br>
	 */
	T findOne(T record);

	List<T> findList(T record, PageVo pageVo);

	/**
	 * 查询对象列表，注意：在给定非null的分页对象时该方法自动设置分页总记录数,如果query和pageable同时为null则查询所有<br>
	 * sqlId=findList
	 * 
	 * @param clazz
	 *            要查询的集合对像
	 * @param sqlId
	 *            mybatis查询ID
	 * @param parms
	 *            查询参数
	 * @return PageInfo<T> 信息方便前台显示
	 */
	List<T> findList(Example example, PageVo pageVo);

	List<Map<?, ?>> findListForMap(Example example, PageVo pageVo);

	/**
	 * 根据实体中的属性查询总数，查询条件使用等号
	 */
	int selectCount(T t);

	/**
	 * 字段数据在表中是否唯一
	 * 
	 * @param clazz
	 *            实体表
	 * @param id
	 *            主键值
	 * @param property
	 *            字段名称
	 * @param value
	 *            字段值
	 * @return true:唯一;false:不唯一
	 */
	boolean isUnique(T entity, String id);

}
